const axios = require('axios');
const fs = require('fs');
const cheerio = require('cheerio');

/**
 * 版本1：使用静态请求获取页面内容
 * 这个版本模拟了 Python 的 requests.get() 方法
 * 但是无法获取动态加载的评论数据
 */

async function staticScraping() {
    // 目标网址
    const url = "https://www.icourse163.org/course/NHDX-1463126169";

    // 设置请求头，模拟浏览器访问
    const headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
        "Accept-Encoding": "gzip, deflate, br",
        "Connection": "keep-alive",
        "Upgrade-Insecure-Requests": "1"
    };

    try {
        console.log('正在发送静态请求...');
        console.log(`目标URL: ${url}`);

        // 发起请求（相当于 Python 的 requests.get）
        const response = await axios.get(url, {
            headers: headers,
            timeout: 30000,  // 30秒超时
            responseType: 'text'  // 确保返回文本
        });

        console.log(`响应状态码: ${response.status}`);
        console.log(`响应类型: ${response.headers['content-type']}`);

        // 确保响应数据是字符串
        const htmlContent = typeof response.data === 'string'
            ? response.data
            : JSON.stringify(response.data);

        // 将响应的内容保存为HTML文件
        const filePath = 'icourse163_static_page.html';
        fs.writeFileSync(filePath, htmlContent, 'utf-8');
        console.log(`页面HTML已保存到: ${filePath}`);
        console.log(`文件大小: ${(htmlContent.length / 1024).toFixed(2)} KB`);

        // 尝试解析评论数据（会失败，因为评论是动态加载的）
        console.log('\n尝试提取评论数据...');
        const $ = cheerio.load(htmlContent);

        // 查找页面标题
        const pageTitle = $('title').text();
        console.log(`页面标题: ${pageTitle}`);

        // 查找评论按钮
        const reviewButton = $('#review-tag-button');
        if (reviewButton.length > 0) {
            console.log('✓ 找到了评论按钮，但评论内容需要点击后动态加载');
        } else {
            // 尝试其他可能的选择器
            const possibleButtons = $('[id*="review"], [class*="review"], [class*="comment"]');
            console.log(`找到可能的评论相关元素: ${possibleButtons.length} 个`);
        }

        // 尝试查找评论内容（这些选择器在静态HTML中找不到）
        const reviewElements = $('.ux-mooc-comment-course-comment_comment-list_item');
        console.log(`\n找到的评论数量: ${reviewElements.length}`);

        if (reviewElements.length === 0) {
            console.log('\n❌ 没有找到任何评论！');
            console.log('原因：评论数据是通过JavaScript动态加载的，静态请求无法获取');

            // 检查页面结构
            console.log('\n页面结构分析：');

            // 查找可能的JavaScript框架标记
            const hasReactRoot = $('#root, #app, [id*="root"]').length > 0;
            const hasVueApp = $('[id="app"], [v-cloak]').length > 0;
            const hasAngular = $('[ng-app], [ng-controller]').length > 0;
            const scriptsCount = $('script').length;
            const externalScripts = $('script[src]').length;

            console.log(`- 包含的<script>标签总数: ${scriptsCount}`);
            console.log(`- 外部JavaScript文件数: ${externalScripts}`);
            console.log(`- 疑似React应用: ${hasReactRoot ? '是' : '否'}`);
            console.log(`- 疑似Vue应用: ${hasVueApp ? '是' : '否'}`);
            console.log(`- 疑似Angular应用: ${hasAngular ? '是' : '否'}`);

            // 查找AJAX请求的线索
            const scriptContents = [];
            $('script').each((i, elem) => {
                const content = $(elem).html();
                if (content && (content.includes('ajax') || content.includes('fetch') || content.includes('axios'))) {
                    scriptContents.push('发现AJAX相关代码');
                }
            });

            if (scriptContents.length > 0) {
                console.log(`- ${scriptContents[0]}`);
            }

            console.log('\n结论：');
            console.log('1. 这是一个依赖JavaScript渲染的单页应用(SPA)');
            console.log('2. 评论数据通过AJAX动态加载，不在初始HTML中');
            console.log('3. 需要使用动态爬虫工具（如Puppeteer）来获取完整内容');
            console.log('4. 或者分析网络请求，直接调用API获取数据');
        } else {
            // 如果意外找到了评论，打印出来
            console.log('找到评论内容：');
            reviewElements.each((i, elem) => {
                if (i < 3) {  // 只打印前3条
                    const reviewText = $(elem).text().trim();
                    console.log(`评论${i + 1}: ${reviewText.substring(0, 50)}...`);
                }
            });
        }

    } catch (error) {
        console.error('请求失败:', error.message);

        if (error.response) {
            console.error(`响应状态码: ${error.response.status}`);
            console.error(`响应状态文本: ${error.response.statusText}`);
        } else if (error.request) {
            console.error('请求已发送但没有收到响应');
        } else {
            console.error('请求配置错误');
        }
    }
}

// 执行函数
console.log('='.repeat(60));
console.log('静态爬虫演示 - 展示为什么需要动态爬虫');
console.log('='.repeat(60));
console.log();

staticScraping().then(() => {
    console.log('\n' + '='.repeat(60));
    console.log('演示完成');
    console.log('='.repeat(60));
});

/**
 * 运行这个脚本后，你会发现：
 * 1. 可以成功获取页面的HTML
 * 2. 但是HTML中不包含评论数据
 * 3. 评论数据需要JavaScript执行后才能加载
 *
 * 这就是为什么需要使用动态爬虫的原因
 */